package com.scy.java.conllection;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

//ArrayList、LinkedList插入性能的差距
/**
 * 在集合头部插入数据(450000)
 * ArrayList头部插入数据耗时7632毫秒
 * linkedList头部插入数据耗时47毫秒
 * 在集合中间插入数据(45000)
 * ArrayList中间插入数据耗时840毫秒
 * linkedList中间插入数据耗时4363毫秒
 * 在集合尾部插入数据(450000)
 * linkedList尾部插入数据耗时9毫秒
 * ArrayList尾部插入数据耗时146毫秒
 */
public class InsertData {
    public static void main(String[] args) {
        //创建ArrayList集合
        ArrayList<Integer> arrayList = new ArrayList<>();
        //创建LinkedList集合
        LinkedList<Integer> linkedList = new LinkedList<>();
        for (int i = 0; i < 450000; i++) {
            arrayList.add(i);
            linkedList.add(i);
        }
        //遍历集合中的数据
//        arrayList.forEach(list-> System.out.println(list));
        Iterator<Integer> iterator = arrayList.iterator();
        //iterator.hasNext()查看集合有没有遍历完
        while (iterator.hasNext()){
            //iterator.next()返回集合的下个元素
            System.out.println(iterator.next());
        }
        //在头部插入数据
//        headInsert();
        //在尾部插入数据
//        tailInsert(arrayList,linkedList);
        //在列表的中间位置插入
//        centreInsert();
        centreInsert(arrayList,linkedList);

    }

    private static void centreInsert(
            ArrayList<Integer> arrayList, LinkedList<Integer> linkedList) {
        long begin = System.currentTimeMillis();
        System.out.println("在集合中间插入数据");
        for (int i = 0; i < 45000; i++) {
            arrayList.add(arrayList.size()/2,i);
        }
        long end = System.currentTimeMillis()-begin;
        System.out.println("ArrayList中间插入数据耗时"+end+"毫秒");
        long begin1 = System.currentTimeMillis();
        for (int i = 0; i < 4500; i++) {
            linkedList.add(linkedList.size()/2,i);
        }
        long end1 = System.currentTimeMillis()-begin1;

        System.out.println("linkedList中间插入数据耗时"+end1+"毫秒");
    }

    //在集合的中间位置插入
    private static void centreInsert() {
        //创建ArrayList集合
        ArrayList<Integer> arrayList = new ArrayList<>();
        //创建LinkedList集合
        LinkedList<Integer> linkedList = new LinkedList<>();
        System.out.println("在arrayList集合中间插入数据");
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 450000; i++) {
            int b = i >> 1;
            arrayList.add(b,i);
        }
        long end = System.currentTimeMillis()-begin;
        System.out.println("ArrayList中间插入数据耗时"+end+"毫秒");
        System.out.println("在linkedList集合中间插入数据");
        long begin1 = System.currentTimeMillis();
        for (int i = 0; i < 450000; i++) {
            int b = i >> 1;
            linkedList.add(b,i);
        }
        long end1 = System.currentTimeMillis()-begin1;
        //linkedList头部插入数据耗时47毫秒
        System.out.println("linkedList中间插入数据耗时"+end1+"毫秒");
    }

    //在集合尾部插入数据
    private static void tailInsert(
            ArrayList<Integer> arrayList, LinkedList<Integer> linkedList) {
//        //创建ArrayList集合
//        ArrayList<Integer> arrayList = new ArrayList<>();
//        //创建LinkedList集合
//        LinkedList<Integer> linkedList = new LinkedList<>();
        System.out.println("在集合尾部插入数据");
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 450000; i++) {
            linkedList.addLast(520);//linkedList尾部插入数据耗时9毫秒
        }
        System.out.println(linkedList.getLast());//查看是否插入
        long end = System.currentTimeMillis()-begin;
        System.out.println("linkedList尾部插入数据耗时"+end+"毫秒");
        long begin1 = System.currentTimeMillis();
        for (int i = 0; i < 450000; i++) {
            arrayList.add(arrayList.size()-1,520);//ArrayList尾部插入数据耗时146毫秒
        }
        System.out.println("arrayList集合中520最后一次出现的位置的索引为："
                +arrayList.lastIndexOf(520));//查看是否插入

        long end1 = System.currentTimeMillis()-begin1;
        System.out.println("ArrayList尾部插入数据耗时"+end1+"毫秒");



    }
    //在集合头部插入
    private static void headInsert() {
        //创建ArrayList集合
        ArrayList<Integer> arrayList = new ArrayList<>();
        //创建LinkedList集合
        LinkedList<Integer> linkedList = new LinkedList<>();
        System.out.println("在集合头部插入数据");
        long begin = System.currentTimeMillis();
        for (int i = 0; i < 450000; i++) {
//            arrayList.add(i);//ArrayList头部插入数据耗时14毫秒
            arrayList.add(0,i);//ArrayList头部插入数据耗时7581毫秒
        }
        long end = System.currentTimeMillis()-begin;
        System.out.println("ArrayList头部插入数据耗时"+end+"毫秒");
        long begin1 = System.currentTimeMillis();
        for (int i = 0; i < 450000; i++) {
            linkedList.addFirst(i);
        }
        long end1 = System.currentTimeMillis()-begin1;
        //linkedList头部插入数据耗时47毫秒
        System.out.println("linkedList头部插入数据耗时"+end1+"毫秒");
    }
}
